<?php

/**
 * Utilsy dla usług
 * @author Anna Rybka
 *
 */
class ServiceUtils {
	
	/**
	 * Metoda zwraca listę usług spełniających dane kryteria
	 * @param $controls kryteria wyszukiwania usług
	 */
	public static function find(ServiceSearchControls $controls) {
		return Manager::getInstance ()->execute ( new ServiceFindCommand ( $controls ) );
	}
	/**
	 * Metoda dodaje usługę do bazy
	 * @param $service usługa
	 */
	public static function add(Service &$service) {
		$sid = Manager::getInstance ()->execute ( new ServiceAddCommand ( $service ) );
		if (VariableUtils::isNumber ( $sid )) {
			$service->setId ( $sid );
		}
		return $service;
	}
	
	/**
	 * Metoda usuwa usługę z bazy
	 * @param $service usługa
	 */
	public static function remove(Service $service) {
		return ServiceUtils::removeById ( $service->getId () );
	}
	
	/**
	 * Metoda usuwa usługę z danym identyfikatorem
	 * @param $id identyfikator usługi do usunięcia
	 */
	public static function removeById($id) {
		return Manager::getInstance ()->execute ( new ServiceDeleteCommand ( $id ) );
	}
	
	/**
	 * Metoda pobiera usługę z danym identyfikatorem
	 * @param $id identyfikator usługi do pobrania
	 */
	public static function get($id) {
		return Manager::getInstance ()->execute ( new ServiceGetCommand ( $id ) );
	}
	
	/**
	 * Metoda modyfikuję usługę o tym samym identyfikatorze
	 * @param $service usługa
	 */
	public static function modify(Service $service) {
		return Manager::getInstance ()->execute ( new ServiceModifyCommand ( $service ) );
	}
	
	/**
	 * Metoda przypisuje promocje do usługi
	 * @param $service usługa
	 * @param $promotion promocja
	 */
	public static function assignPromotion(Service $service, Promotion $promotion) {
		return Manager::getInstance ()->execute ( new AssignPromotionCommand ( $service, $promotion ) );
	}
	
	/**
	 * Metoda usuwa promocje do usługi
	 * @param $service usługa
	 * @param $promotion promocja
	 */
	public static function unAssignPromotion(Service $service, Promotion $promotion = null) {
		return Manager::getInstance ()->execute ( new UnassignPromotionCommand( $service, $promotion ) );
	}
	
	/**
	 * Metoda dodaje część usługi do baz
	 * @param $servicePart część usługi
	 */
	public static function addPart(ServicePart &$servicePart) {
		$spid = Manager::getInstance ()->execute ( new ServicePartAddCommand ( $servicePart ) );
		if (VariableUtils::isNumber ( $spid )) {
			$servicePart->setId ( $spid );
		}
		return $servicePart;
	}
	
	/**
	 * Metoda usuwa część usługi z bazy
	 * @param $servicePart część usługi
	 */
	public static function removePart(ServicePart $servicePart) {
		return ServiceUtils::removePartById ( $servicePart->getId () );
	}
	
	/**
	 * Metoda usuwa część usługi z danym identyfikatorem
	 * @param $id identyfikator usługi do usunięcia
	 */
	public static function removePartById($id) {
		return Manager::getInstance ()->execute ( new ServicePartDeleteCommand ( $id ) );
	}
	
	/**
	 * Metoda modyfikuję część usługi o tym samym identyfikatorze
	 * @param $servicePart część usługi
	 */
	public static function modifyPart(ServicePart $servicePart) {
		return Manager::getInstance ()->execute ( new ServicePartModifyCommand ( $servicePart ) );
	}
	
	/**
	 * Metoda dodaje do serwisu część
	 * @param $servicePart  część usługi
	 * @param $service usługa
	 */
	public static function addServicePart(ServicePart $servicePart, Service $service) {
		return Manager::getInstance ()->execute ( new ServiceAddPartCommand ( $servicePart, $service ) );
	}
	
	/**
	 * Metoda usuwa z serwisu jego część
	 * @param $servicePart  część usługi
	 * @param $service usługa
	 */
	public static function removeServicePart(ServicePart $servicePart, Service $service) {
		return ServiceUtils::removeServicePartByIds ( $servicePart->getId (), $service->getId () );
	}
	
	/**
	 * Metoda usuwa z serwisu jego część
	 * @param $servicePartId  id części usługi
	 * @param $serviceId id usługi
	 */
	public static function removeServicePartByIds($servicePartId, $serviceId) {
		return Manager::getInstance ()->execute ( new ServiceDeletePartCommand ( $servicePartId, $serviceId ) );
	}
	
	/**
	 * Metoda zwraca części spełniające dane kryteria
	 * @param $controls kryteria wyszukiwania 
	 * @return wszystkie dostępne części serwisów
	 */
	public static function findPart(ServicePartSearchControls $controls) {
		return Manager::getInstance ()->execute ( new ServicePartFindCommand ( $controls ) );
	}
	
	/**
	 * Metoda pobiera część usługi o określonym identyfikatorze
	 * @param $id identyfikatorze części usługi
	 */
	public static function getServicePart($id) {
		return Manager::getInstance ()->execute ( new ServicePartGetCommand ( $id ) );
	}
}

?>